1 Requirements

[1] "Required package(s) dplyr, ggplot2, tidyr, Hmisc are already installed."
[1] "Required package(s) dplyr, ggplot2, tidyr, Hmisc are loaded."

2 Sample overview

2.1 Data import

  • Checking if result file(s) are available:
  • Importing result table(s):
[1] "Import of counts table complete."

2.2 Sample table

  • overview of samples

3 Quality control

3.1 Total number of mapped reads per sample

3.2 Number of individual barcodes per sample

3.3 Number of missing barcodes per sample

3.4 Number of barcodes per gene, per sample

`summarise()` has grouped output by 'sample'. You can override using the
`.groups` argument.

3.5 Read count distribution, per sample (capped at 1000 barcodes)

3.6 Number of reads per barcode, per sample

3.7 Top 10 most abundant barcodes, per sample

3.8 Cumulative read count distribution and population equality

3.9 Sample and replicate correlation coefficent (R)

3.10 Sample and replicate similarity with PCA

4 Report info

The template for this report is located in ./nf-core-crispriscreen/bin/counts_summary.Rmd.

Date: 2022-04-28

Author: Michael Jahn, PhD

Affilations:

5 Session Info

R version 4.3.2 (2023-10-31)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 22.04.3 LTS

Matrix products: default
BLAS:   /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 
LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so;  LAPACK version 3.10.0

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=sv_SE.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=sv_SE.UTF-8    LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=sv_SE.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=sv_SE.UTF-8 LC_IDENTIFICATION=C       

time zone: Europe/Stockholm
tzcode source: system (glibc)

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] Hmisc_5.1-1   tidyr_1.3.0   ggplot2_3.4.4 dplyr_1.0.10 

loaded via a namespace (and not attached):
 [1] sass_0.4.7        utf8_1.2.4        generics_0.1.3    stringi_1.7.12   
 [5] digest_0.6.33     magrittr_2.0.3    evaluate_0.23     grid_4.3.2       
 [9] fastmap_1.1.1     jsonlite_1.8.7    nnet_7.3-19       backports_1.4.1  
[13] DBI_1.1.3         Formula_1.2-5     gridExtra_2.3     purrr_1.0.2      
[17] fansi_1.0.5       scales_1.2.1      jquerylib_0.1.4   cli_3.6.1        
[21] rlang_1.1.2       munsell_0.5.0     base64enc_0.1-3   withr_2.5.0      
[25] cachem_1.0.8      yaml_2.3.7        tools_4.3.2       checkmate_2.1.0  
[29] htmlTable_2.4.2   colorspace_2.1-0  assertthat_0.2.1  vctrs_0.6.4      
[33] R6_2.5.1          rpart_4.1.23      lifecycle_1.0.4   stringr_1.5.0    
[37] htmlwidgets_1.5.4 foreign_0.8-86    cluster_2.1.6     pkgconfig_2.0.3  
[41] pillar_1.9.0      bslib_0.5.1       gtable_0.3.4      data.table_1.14.8
[45] glue_1.6.2        highr_0.10        xfun_0.41         tibble_3.2.1     
[49] tidyselect_1.2.0  rstudioapi_0.14   knitr_1.45        farver_2.1.1     
[53] htmltools_0.5.7   labeling_0.4.2    rmarkdown_2.25    compiler_4.3.2   
LS0tCnRpdGxlOiAiUmVhZCBjb3VudHMgc3VtbWFyeSIKYXV0aG9yOiAiU1lTVEVNOiBgciB2ZXJzaW9uWzEzXWAiCmRhdGU6ICJEQVRFOiBgciBTeXMudGltZSgpYCIKcGFyYW1zOgogIGNwdXM6IDIKICBhcnRpZmFjdF9kaXI6IGFydGlmYWN0cwogIGlucHV0X2RpcjogLi8KICBtZXRhOiAiIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRoZW1lOiBjb3NtbwogICAgdG9jOiB5ZXMKICAgIG51bWJlcl9zZWN0aW9uczogeWVzCiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogeWVzCiAgICBkZl9wcmludDogcGFnZWQKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZSA9IEZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFKQpgYGAKCiMgUmVxdWlyZW1lbnRzCgotIGlmIG5vdCBhbGwgZGVwZW5kZW5jaWVzIGFyZSBzYXRpc2ZpZWQgYnkgUiBlbnZpcm9ubWVudCwgdHJ5IHRvIGluc3RhbGwgYWRkaXRpb25hbCBsaWJyYXJpZXMgYGRwbHlyYCwgYGdncGxvdDJgLCBgdGlkeXJgLCBgSG1pc2NgCi0gbG9hZGluZyBsaWJyYXJpZXMKCmBgYHtyfQpsaXN0X3JlcV9wYWNrYWdlcyA8LSBjKCJkcGx5ciIsICJnZ3Bsb3QyIiwgInRpZHlyIiwgIkhtaXNjIikKbGlzdF90b19pbnN0YWxsIDwtIHNldGRpZmYobGlzdF9yZXFfcGFja2FnZXMsIHJvd25hbWVzKGluc3RhbGxlZC5wYWNrYWdlcygpKSkKCmlmIChsZW5ndGgobGlzdF90b19pbnN0YWxsKSkgewogICAgcGtkaXIgPC0gcGFzdGUwKHN5c3RlbSgiZWNobyAke0hPTUV9IiwgaW50ZXJuID0gVFJVRSksICIvLlIiKQogICAgc3lzdGVtKHBhc3RlMCgibWtkaXIgIiwgcGtkaXIpKQogICAgLmxpYlBhdGhzKG5ldyA9IHBrZGlyKQogICAgaW5zdGFsbC5wYWNrYWdlcyhwa2dzID0gbGlzdF90b19pbnN0YWxsLCBsaWIgPSBwa2RpcikKICAgIHByaW50KHBhc3RlMCgiTWlzc2luZyBwYWNrYWdlKHMpICIsIHBhc3RlKGxpc3RfdG9faW5zdGFsbCwgY29sbGFwc2UgPSAiLCAiKSwgIiBhcmUgaW5zdGFsbGVkIHRvICciLCBwa2RpciwgIicuIikpCn0gZWxzZSB7CiAgICBwcmludChwYXN0ZTAoIlJlcXVpcmVkIHBhY2thZ2UocykgIiwgcGFzdGUobGlzdF9yZXFfcGFja2FnZXMsIGNvbGxhcHNlID0gIiwgIiksICIgYXJlIGFscmVhZHkgaW5zdGFsbGVkLiIpKQp9CmBgYAoKLSBsb2FkaW5nIGxpYnJhcmllcwoKYGBge3J9CnN1cHByZXNzUGFja2FnZVN0YXJ0dXBNZXNzYWdlcyh7CiAgICBmb3IgKHBrZyBpbiBsaXN0X3JlcV9wYWNrYWdlcykgewogICAgICAgIGxpYnJhcnkocGtnLCBjaGFyYWN0ZXIub25seSA9IFRSVUUpCiAgICB9Cn0pCnByaW50KHBhc3RlMCgiUmVxdWlyZWQgcGFja2FnZShzKSAiLCBwYXN0ZShsaXN0X3JlcV9wYWNrYWdlcywgY29sbGFwc2UgPSAiLCAiKSwgIiBhcmUgbG9hZGVkLiIpKQpgYGAKCiMgU2FtcGxlIG92ZXJ2aWV3CgojIyBEYXRhIGltcG9ydAoKLSBDaGVja2luZyBpZiByZXN1bHQgZmlsZShzKSBhcmUgYXZhaWxhYmxlOgoKYGBge3J9CiMgZ2V0IGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkKd2QgPC0gZ2V0d2QoKQppbnB1dF9wYXR0ZXJuIDwtICJhbGxfY291bnRzLnRzdiIKCiMgY2hlY2sgaW5wdXQgZmlsZXMgYW5kIGNvbXBpbGUgc21hbGwgdGFibGUKaW5wdXRfZmlsZXMgPC0gZ3JlcChsaXN0LmZpbGVzKHdkKSwgcGF0dGVybiA9IGlucHV0X3BhdHRlcm4sIHZhbHVlID0gVFJVRSkKaWYgKGxlbmd0aChpbnB1dF9maWxlcykgPT0gMSkgewogICAgZGZfaW5wdXQgPC0gYmluZF9jb2xzKAogICAgICAgIGRhdGEuZnJhbWUoaW5wdXRfZmlsZXMpLAogICAgICAgIGZpbGUuaW5mbyhwYXN0ZSh3ZCwgaW5wdXRfZmlsZXMsIHNlcCA9ICIvIikpCiAgICApICU+JQogICAgICAgIG11dGF0ZShzaXplID0gcGFzdGUoc2l6ZSAvIDFlNiwgIk1CIikpCiAgICByb3duYW1lcyhkZl9pbnB1dCkgPC0gTlVMTAogICAgZGZfaW5wdXRbYygxLCAyLCAzLCA0LCA1LCAxMCldCn0gZWxzZSB7CiAgICBzdG9wKHBhc3RlMCgiUmVxdWlyZWQgaW5wdXQgZmlsZShzKSAnIiwgaW5wdXRfcGF0dGVybiwgIicgd2VyZSBub3QgZm91bmQuIikpCn0KYGBgCgotIEltcG9ydGluZyByZXN1bHQgdGFibGUocyk6CgpgYGB7cn0KIyBsb2FkIGNvdW50cyBtYXRyaXgKZGZfY291bnRzIDwtIHJlYWQuZGVsaW0ocGFzdGUwKHdkLCAiLyIsIGlucHV0X3BhdHRlcm4pKQpkZl9jb3VudHMgPC0gdGlkeXI6OnBpdm90X2xvbmdlcihkZl9jb3VudHMsCiAgICBjb2xzID0gMzpuY29sKGRmX2NvdW50cyksCiAgICBuYW1lc190byA9ICJzYW1wbGUiLCB2YWx1ZXNfdG8gPSAibl9yZWFkcyIKKQojIHNvcnQKZGZfY291bnRzIDwtIGFycmFuZ2UoZGZfY291bnRzLCBzYW1wbGUpCnByaW50KCJJbXBvcnQgb2YgY291bnRzIHRhYmxlIGNvbXBsZXRlLiIpCmBgYAoKIyMgU2FtcGxlIHRhYmxlCgotIG92ZXJ2aWV3IG9mIHNhbXBsZXMKCmBgYHtyfQojIGxpc3Qgb2Ygc2FtcGxlcyArIGdlbmVyaWMgb3B0aW9ucwpsaXN0X3NhbXBsZXMgPC0gdW5pcXVlKGRmX2NvdW50cyRzYW1wbGUpCmZpZ3dpZHRoIDwtIDkKZmlnaGVpZ2h0IDwtIHJvdW5kKDEgKyAobGVuZ3RoKGxpc3Rfc2FtcGxlcykgLyA0KSkKZmlnaGVpZ2h0MiA8LSAzICogZmlnaGVpZ2h0CgojIG91dHB1dCBzYW1wbGUgdGFibGUKdGVzdCA8LSBkZl9jb3VudHMgJT4lCiAgICBkcGx5cjo6Z3JvdXBfYnkoc2FtcGxlKSAlPiUKICAgIGRwbHlyOjpzdW1tYXJpemUoCiAgICAgICAgYmFyY29kZXMgPSBsZW5ndGgodW5pcXVlKHNnUk5BKSksCiAgICAgICAgdG90YWxfcmVhZHMgPSBzdW0obl9yZWFkcywgbmEucm0gPSBUUlVFKSwKICAgICAgICBtaW5fcmVhZHMgPSBtaW4obl9yZWFkcywgbmEucm0gPSBUUlVFKSwKICAgICAgICBtZWFuX3JlYWRzID0gbWVhbihuX3JlYWRzLCBuYS5ybSA9IFRSVUUpLAogICAgICAgIG1heF9yZWFkcyA9IG1heChuX3JlYWRzLCBuYS5ybSA9IFRSVUUpLAogICAgKQpgYGAKCiMgUXVhbGl0eSBjb250cm9sCgpgYGB7ciwgd2FybmluZyA9IEZBTFNFfQojIGRlZmluZSBhIGN1c3RvbSBnZ3Bsb3QyIHRoZW1lIChqdXN0IGZvciBwcmV0dGluZXNzKQojIGN1c3RvbSBnZ3Bsb3QyIHRoZW1lIHRoYXQgaXMgcmV1c2VkIGZvciBhbGwgbGF0ZXIgcGxvdHMKY3VzdG9tX2NvbG9ycyA8LSBjKCIjRTcyOThBIiwgIiM2NkE2MUUiLCAiI0U2QUIwMiIsICIjNzU3MEIzIiwgIiNCM0IzQjMiLCAiIzFCOUU3NyIsICIjRDk1RjAyIiwgIiNBNjc2MUQiKQpjdXN0b21fcmFuZ2UgPC0gZnVuY3Rpb24obiA9IDUpIHsKICAgIGNvbG9yUmFtcFBhbGV0dGUoY3VzdG9tX2NvbG9yc1tjKDEsIDUsIDIpXSkobikKfQoKY3VzdG9tX3RoZW1lIDwtIGZ1bmN0aW9uKGJhc2Vfc2l6ZSA9IDEyLCBiYXNlX2xpbmVfc2l6ZSA9IDEuMCwgYmFzZV9yZWN0X3NpemUgPSAxLjAsIC4uLikgewogICAgdGhlbWVfbGlnaHQoYmFzZV9zaXplID0gYmFzZV9zaXplLCBiYXNlX2xpbmVfc2l6ZSA9IGJhc2VfbGluZV9zaXplLCBiYXNlX3JlY3Rfc2l6ZSA9IGJhc2VfcmVjdF9zaXplKSArIHRoZW1lKAogICAgICAgIHRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG91ciA9IGdyZXkoMC40KSwgc2l6ZSA9IDEwKSwKICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygxMiwgMTIsIDEyLCAxMiksICJwb2ludHMiKSwKICAgICAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoMC4yLCAiY20iKSwKICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGNvbG91ciA9IGdyZXkoMC40KSwgbGluZXR5cGUgPSAic29saWQiLCBsaW5lZW5kID0gInJvdW5kIiksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3VyID0gZ3JleSgwLjQpLCBzaXplID0gMTApLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG91ciA9IGdyZXkoMC40KSwgc2l6ZSA9IDEwKSwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKHNpemUgPSAwLjYsIGxpbmV0eXBlID0gInNvbGlkIiwgY29sb3VyID0gZ3JleSgwLjkpKSwKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChsaW5ldHlwZSA9ICJzb2xpZCIsIGNvbG91ciA9IGdyZXkoMC40KSwgZmlsbCA9IE5BLCBzaXplID0gMS4wKSwKICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvdXIgPSBncmV5KDAuNCksIHNpemUgPSAxMCwgbWFyZ2luID0gdW5pdChyZXAoMywgNCksICJwb2ludHMiKSksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3VyID0gZ3JleSgwLjQpLCBzaXplID0gMTApLAogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAuLi4KICAgICkKfQpgYGAKCiMjIFRvdGFsIG51bWJlciBvZiBtYXBwZWQgcmVhZHMgcGVyIHNhbXBsZQoKYGBge3IsIGZpZy53aWR0aCA9IGZpZ3dpZHRoLCBmaWcuaGVpZ2h0ID0gZmlnaGVpZ2h0LCB3YXJuaW5nID0gRkFMU0V9CmRmX2NvdW50cyAlPiUKICAgIGRwbHlyOjpncm91cF9ieShzYW1wbGUpICU+JQogICAgZHBseXI6OnN1bW1hcml6ZShuX3JlYWRzID0gc3VtKG5fcmVhZHMpKSAlPiUKICAgIGdncGxvdChhZXMoeCA9IHNhbXBsZSwgeSA9IG5fcmVhZHMpKSArCiAgICBjb29yZF9mbGlwKCkgKwogICAgZ2VvbV9jb2woZmlsbCA9IGN1c3RvbV9jb2xvcnNbMV0sIGFscGhhID0gMC43KSArCiAgICBsYWJzKHggPSAiIiwgeSA9ICJ0b3RhbCBudW1iZXIgb2YgbWFwcGVkIHJlYWRzIikgKwogICAgY3VzdG9tX3RoZW1lKCkKYGBgCgojIyBOdW1iZXIgb2YgaW5kaXZpZHVhbCBiYXJjb2RlcyBwZXIgc2FtcGxlCgpgYGB7ciwgZmlnLndpZHRoID0gZmlnd2lkdGgsIGZpZy5oZWlnaHQgPSBmaWdoZWlnaHQsIHdhcm5pbmcgPSBGQUxTRX0KZGZfY291bnRzICU+JQogICAgZHBseXI6Omdyb3VwX2J5KHNhbXBsZSkgJT4lCiAgICBkcGx5cjo6c3VtbWFyaXplKGB1bmlxdWUgYmFyY29kZXMgcGVyIHNhbXBsZWAgPSBzdW0obl9yZWFkcyA+IDApKSAlPiUKICAgIGdncGxvdChhZXMoeCA9IHNhbXBsZSwgeSA9IGB1bmlxdWUgYmFyY29kZXMgcGVyIHNhbXBsZWApKSArCiAgICBnZW9tX2NvbChmaWxsID0gY3VzdG9tX2NvbG9yc1sxXSwgYWxwaGEgPSAwLjcpICsKICAgIGxhYnMoeCA9ICIiKSArCiAgICBjb29yZF9mbGlwKCkgKwogICAgY3VzdG9tX3RoZW1lKCkKYGBgCgojIyBOdW1iZXIgb2YgbWlzc2luZyBiYXJjb2RlcyBwZXIgc2FtcGxlCgpgYGB7ciwgZmlnLndpZHRoID0gZmlnd2lkdGgsIGZpZy5oZWlnaHQgPSBmaWdoZWlnaHQsIHdhcm5pbmcgPSBGQUxTRX0KZGZfY291bnRzICU+JQogICAgZHBseXI6Omdyb3VwX2J5KHNhbXBsZSkgJT4lCiAgICBkcGx5cjo6c3VtbWFyaXplKGBtaXNzaW5nIGJhcmNvZGVzIHBlciBzYW1wbGVgID0gc3VtKG5fcmVhZHMgPT0gMCkpICU+JQogICAgZ2dwbG90KGFlcyh4ID0gc2FtcGxlLCB5ID0gYG1pc3NpbmcgYmFyY29kZXMgcGVyIHNhbXBsZWApKSArCiAgICBnZW9tX2NvbChmaWxsID0gY3VzdG9tX2NvbG9yc1sxXSwgYWxwaGEgPSAwLjcpICsKICAgIGxhYnMoeCA9ICIiKSArCiAgICBjb29yZF9mbGlwKCkgKwogICAgY3VzdG9tX3RoZW1lKCkKYGBgCgojIyBOdW1iZXIgb2YgYmFyY29kZXMgcGVyIGdlbmUsIHBlciBzYW1wbGUKCmBgYHtyLCBmaWcud2lkdGggPSBmaWd3aWR0aCwgZmlnLmhlaWdodCA9IGZpZ2hlaWdodCwgd2FybmluZyA9IEZBTFNFfQpkZl9jb3VudHMgJT4lCiAgICBkcGx5cjo6Z3JvdXBfYnkoc2FtcGxlLCBHZW5lKSAlPiUKICAgIGRwbHlyOjpzdW1tYXJpemUoYHVuaXF1ZSBiYXJjb2Rlc2AgPSBsZW5ndGgodW5pcXVlKHNnUk5BKSkpICU+JQogICAgZHBseXI6OmNvdW50KGB1bmlxdWUgYmFyY29kZXNgKSAlPiUKICAgIGdncGxvdChhZXMoeCA9IHNhbXBsZSwgeSA9IG4sIGZpbGwgPSBmYWN0b3IoYHVuaXF1ZSBiYXJjb2Rlc2ApKSkgKwogICAgZ2VvbV9jb2woYWxwaGEgPSAwLjcpICsKICAgIGdlb21fdGV4dChhZXMoCiAgICAgICAgeCA9IHNhbXBsZSwKICAgICAgICB5ID0gdW5saXN0KCh0YXBwbHkobiwgc2FtcGxlLCBmdW5jdGlvbih4KSBjdW1zdW0ocmV2KHgpKSAtIChyZXYoeCkgLyAyKSkpKSwKICAgICAgICBsYWJlbCA9IHJldihgdW5pcXVlIGJhcmNvZGVzYCkKICAgICksIGNvbG9yID0gIndoaXRlIikgKwogICAgbGFicyh4ID0gIiIpICsKICAgIGNvb3JkX2ZsaXAoKSArCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xvclJhbXBQYWxldHRlKGN1c3RvbV9jb2xvcnNbMTo1XSkoOSkpICsKICAgIGN1c3RvbV90aGVtZShsZWdlbmQucG9zaXRpb24gPSAwKQpgYGAKCiMjIFJlYWQgY291bnQgZGlzdHJpYnV0aW9uLCBwZXIgc2FtcGxlIChjYXBwZWQgYXQgMTAwMCBiYXJjb2RlcykKCmBgYHtyLCBmaWcud2lkdGggPSBmaWd3aWR0aCwgZmlnLmhlaWdodCA9IGZpZ2hlaWdodCwgd2FybmluZyA9IEZBTFNFfQpkZl9jb3VudHMgJT4lCiAgICBkcGx5cjo6Z3JvdXBfYnkoc2FtcGxlKSAlPiUKICAgIGRwbHlyOjpzbGljZSgxOjEwMDApICU+JQogICAgZ2dwbG90KGFlcyh4ID0gc2FtcGxlLCB5ID0gbG9nMTAobl9yZWFkcykpKSArCiAgICBnZW9tX3Zpb2xpbigKICAgICAgICB0cmltID0gRkFMU0UsIGZpbGwgPSBjdXN0b21fY29sb3JzWzFdLAogICAgICAgIGFscGhhID0gMC43LCBjb2wgPSAid2hpdGUiCiAgICApICsKICAgIGNvb3JkX2ZsaXAoKSArCiAgICBzdGF0X3N1bW1hcnkoZnVuLmRhdGEgPSBtZWFuX3NkbCwgZ2VvbSA9ICJwb2ludHJhbmdlIiwgc2l6ZSA9IDAuNSwgY29sID0gZ3JleSgwLjMpKSArCiAgICBjdXN0b21fdGhlbWUoKQpgYGAKCiMjIE51bWJlciBvZiByZWFkcyBwZXIgYmFyY29kZSwgcGVyIHNhbXBsZQoKYGBge3IsIGZpZy53aWR0aCA9IGZpZ3dpZHRoLCBmaWcuaGVpZ2h0ID0gZmlnaGVpZ2h0Miwgd2FybmluZyA9IEZBTFNFfQpkZl9jb3VudHMgJT4lCiAgICBnZ3Bsb3QoYWVzKHggPSBsb2cyKG5fcmVhZHMpKSkgKwogICAgZ2VvbV9oaXN0b2dyYW0oZmlsbCA9IGN1c3RvbV9jb2xvcnNbMV0sIGFscGhhID0gMC43LCBiaW5zID0gMzApICsKICAgIGxhYnMoeSA9ICIiLCB4ID0gZXhwcmVzc2lvbigibG9nIlsyXSAqICIgcmVhZHMgcGVyIGJhcmNvZGUiKSkgKwogICAgZmFjZXRfd3JhcCh+c2FtcGxlLCBuY29sID0gMikgKwogICAgY3VzdG9tX3RoZW1lKCkKYGBgCgojIyBUb3AgMTAgbW9zdCBhYnVuZGFudCBiYXJjb2RlcywgcGVyIHNhbXBsZQoKYGBge3IsIGZpZy53aWR0aCA9IGZpZ3dpZHRoLCBmaWcuaGVpZ2h0ID0gZmlnaGVpZ2h0Miwgd2FybmluZyA9IEZBTFNFfQpkZl9jb3VudHMgJT4lCiAgICBkcGx5cjo6Z3JvdXBfYnkoc2FtcGxlKSAlPiUKICAgIGRwbHlyOjphcnJhbmdlKHNhbXBsZSwgZGVzYyhuX3JlYWRzKSkgJT4lCiAgICBkcGx5cjo6bXV0YXRlKHJhbmsgPSBzZXFfYWxvbmcoc2dSTkEpKSAlPiUKICAgIGRwbHlyOjpmaWx0ZXIoYmV0d2VlbihyYW5rLCAxLCAxMCkpICU+JQogICAgZ2dwbG90KGFlcyh4ID0gZmFjdG9yKHJhbmspLCB5ID0gbl9yZWFkcykpICsKICAgIGdlb21fY29sKGZpbGwgPSBjdXN0b21fY29sb3JzWzFdLCBhbHBoYSA9IDAuNywgd2lkdGggPSAxKSArCiAgICBsYWJzKHkgPSAibiByZWFkcyIsIHggPSAiYmFyY29kZXMgcmFua2VkIGJ5IGFidW5kYW5jZSIpICsKICAgIGZhY2V0X3dyYXAofnNhbXBsZSwgbmNvbCA9IDIpICsKICAgIGN1c3RvbV90aGVtZSgpCmBgYAoKIyMgQ3VtdWxhdGl2ZSByZWFkIGNvdW50IGRpc3RyaWJ1dGlvbiBhbmQgcG9wdWxhdGlvbiBlcXVhbGl0eQoKYGBge3IsIGZpZy53aWR0aCA9IGZpZ3dpZHRoLCBmaWcuaGVpZ2h0ID0gZmlnaGVpZ2h0Miwgd2FybmluZyA9IEZBTFNFfQpkZl9hdWMgPC0gZGZfY291bnRzICU+JQogICAgZHBseXI6OmFycmFuZ2Uoc2FtcGxlLCBkZXNjKG5fcmVhZHMpKSAlPiUKICAgIGRwbHlyOjpncm91cF9ieShzYW1wbGUpICU+JQogICAgZHBseXI6Om11dGF0ZSgKICAgICAgICBwY19iYXJjb2RlcyA9IDEwMCAqIHNlcV9hbG9uZyhuX3JlYWRzKSAvIG4oKSwKICAgICAgICBwY19yZWFkcyA9IDEwMCAqIG5fcmVhZHMgLyAoc3VtKG5fcmVhZHMpKQogICAgKSAlPiUKICAgIGRwbHlyOjptdXRhdGUocGNfYmFyY29kZXMgPSByb3VuZChwY19iYXJjb2RlcykpICU+JQogICAgZHBseXI6Omdyb3VwX2J5KHNhbXBsZSwgcGNfYmFyY29kZXMpICU+JQogICAgZHBseXI6OnN1bW1hcml6ZShwY19yZWFkcyA9IHN1bShwY19yZWFkcyksIC5ncm91cHMgPSAiZHJvcF9sYXN0IikgJT4lCiAgICBkcGx5cjo6bXV0YXRlKHBjX3JlYWRzID0gY3Vtc3VtKHBjX3JlYWRzKSkKCmRmX2F1YyAlPiUKICAgIGdncGxvdChhZXMoeCA9IHBjX2JhcmNvZGVzLCB5ID0gcGNfcmVhZHMsIGdyb3VwID0gc2FtcGxlKSkgKwogICAgZ2VvbV9saW5lKGxpbmV3aWR0aCA9IDEuMCwgY29sb3IgPSBjdXN0b21fY29sb3JzWzFdKSArCiAgICBnZW9tX2FibGluZSgKICAgICAgICBzbG9wZSA9IDEsIGludGVyY2VwdCA9IDAsIGxpbmV3aWR0aCA9IDEuMCwKICAgICAgICBsaW5ldHlwZSA9IDIsIGNvbG9yID0gZ3JleSgwLjUpCiAgICApICsKICAgIGZhY2V0X3dyYXAofnNhbXBsZSwgbmNvbCA9IDIpICsKICAgIGxpbXMoeCA9IGMoMCwgMTAwKSwgeSA9IGMoMCwgMTAwKSkgKwogICAgbGFicyh4ID0gIiUgb2YgYmFyY29kZXMiLCB5ID0gIiUgb2YgcmVhZHMiKSArCiAgICBjdXN0b21fdGhlbWUoKQpgYGAKCmBgYHtyLCB3YXJuaW5nID0gRkFMU0V9CmNhbGNfYXVjIDwtIGZ1bmN0aW9uKHgsIHkpIHsKICAgIHN1bShkaWZmKHgpICogKGhlYWQoeSwgLTEpICsgdGFpbCh5LCAtMSkpKSAvIDIKfQpkZl9hdWMgJT4lCiAgICBkcGx5cjo6c3VtbWFyaXplKAogICAgICAgIGF1YyA9IGNhbGNfYXVjKHBjX2JhcmNvZGVzLCBwY19yZWFkcyksCiAgICAgICAgZ2luaSA9IChhdWMgLSA1MDAwKSAvIDUwMDAKICAgICkgJT4lCiAgICBtdXRhdGUocXVhbGl0eSA9IGNhc2Vfd2hlbigKICAgICAgICBnaW5pIDw9IDAuMiB+ICJPSyIsCiAgICAgICAgZ2luaSA+IDAuMiAmIGdpbmkgPD0gMC41IH4gIndhcm5pbmc6IGluZXF1YWwgcmVhZCBkaXN0cmlidXRpb24iLAogICAgICAgIGdpbmkgPiAwLjUgfiAid2FybmluZzogZXh0cmVtZWx5IGluZXF1YWwgcmVhZCBkaXN0cmlidXRpb24iCiAgICApKQpgYGAKCgojIyBTYW1wbGUgYW5kIHJlcGxpY2F0ZSBjb3JyZWxhdGlvbiBjb2VmZmljZW50IChSKQoKYGBge3IsIGZpZy53aWR0aCA9IDcuNSwgZmlnLmhlaWdodCA9IDcsIHdhcm5pbmcgPSBGQUxTRX0KZGZfY291bnRzICU+JQogICAgdGlkeXI6OnBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSAic2FtcGxlIiwgdmFsdWVzX2Zyb20gPSAibl9yZWFkcyIpICU+JQogICAgZHBseXI6OnNlbGVjdCgtYygxOjIpKSAlPiUKICAgIGNvcigpICU+JQogICAgZHBseXI6OmFzX3RpYmJsZSgpICU+JQogICAgZHBseXI6Om11dGF0ZShzYW1wbGUxID0gY29sbmFtZXMoLikpICU+JQogICAgdGlkeXI6OnBpdm90X2xvbmdlcigKICAgICAgICBjb2xzID0gIXNhbXBsZTEsCiAgICAgICAgbmFtZXNfdG8gPSAic2FtcGxlMiIsIHZhbHVlc190byA9ICJjb3JfY29lZiIKICAgICkgJT4lCiAgICBnZ3Bsb3QoYWVzKHggPSBzYW1wbGUxLCB5ID0gc2FtcGxlMiwgZmlsbCA9IGNvcl9jb2VmKSkgKwogICAgZ2VvbV90aWxlKCkgKwogICAgZ2VvbV90ZXh0KGNvbG9yID0gZ3JleSgwLjQpLCBhZXMobGFiZWwgPSByb3VuZChjb3JfY29lZiwgMikpKSArCiAgICBjdXN0b21fdGhlbWUoKSArCiAgICBsYWJzKHRpdGxlID0gIiIsIHggPSAiIiwgeSA9ICIiKSArCiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSwgaGp1c3QgPSAxKSkgKwogICAgc2NhbGVfZmlsbF9ncmFkaWVudG4oCiAgICAgICAgY29sb3VycyA9IGMoY3VzdG9tX2NvbG9yc1sxXSwgZ3JleSgwLjkpLCBjdXN0b21fY29sb3JzWzJdKSwKICAgICAgICBsaW1pdHMgPSBjKC0xLCAxKQogICAgKQpgYGAKCiMjIFNhbXBsZSBhbmQgcmVwbGljYXRlIHNpbWlsYXJpdHkgd2l0aCBQQ0EKCmBgYHtyLCBmaWcud2lkdGggPSA3LCBmaWcuaGVpZ2h0ID0gNywgd2FybmluZyA9IEZBTFNFfQpwY2FfcmVzdWx0IDwtIGRmX2NvdW50cyAlPiUKICAgIHRpZHlyOjpwaXZvdF93aWRlcihuYW1lc19mcm9tID0gInNhbXBsZSIsIHZhbHVlc19mcm9tID0gIm5fcmVhZHMiKSAlPiUKICAgIGRwbHlyOjpzZWxlY3QoLWMoMToyKSkgJT4lCiAgICBhcy5tYXRyaXgoKSAlPiUKICAgIHQoKSAlPiUKICAgIHJlcGxhY2UoLiwgaXMubmEoLiksIDApICU+JQogICAgcHJjb21wKCkKCmRmX1BDQSA8LSBwY2FfcmVzdWx0JHggJT4lCiAgICBhc190aWJibGUocm93bmFtZXMgPSAic2FtcGxlIikKCmRmX1BDQSAlPiUKICAgIGdncGxvdChhZXMoeCA9IFBDMSwgeSA9IC1QQzIsIHNpemUgPSBQQzMsIGNvbG9yID0gc2FtcGxlLCBsYWJlbCA9IHNhbXBsZSkpICsKICAgIGdlb21fcG9pbnQoYWxwaGEgPSAwLjcpICsKICAgIGdlb21fdGV4dChzaXplID0gMi41LCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgICBsYWJzKAogICAgICAgIHRpdGxlID0gIlBDQSwgZmlyc3QgdGhyZWUgcHJpbmNpcGFsIGNvbXBvbmVudHMiLAogICAgICAgIHN1YnRpdGxlID0gIlBvaW50IHNpemUgZW5jb2RlcyBQQzMiLCB4ID0gIlBDMSIsIHkgPSAiUEMyIgogICAgKSArCiAgICBjdXN0b21fdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gMCwgYXNwZWN0ID0gMSkgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbG9yUmFtcFBhbGV0dGUoY3VzdG9tX2NvbG9ycykobnJvdyhkZl9QQ0EpKSkgKwogICAgZ3VpZGVzKHNpemUgPSAibm9uZSIpCmBgYAoKIyBSZXBvcnQgaW5mbwoKVGhlIHRlbXBsYXRlIGZvciB0aGlzIHJlcG9ydCBpcyBsb2NhdGVkIGluIGAuL25mLWNvcmUtY3Jpc3ByaXNjcmVlbi9iaW4vY291bnRzX3N1bW1hcnkuUm1kYC4KCkRhdGU6IDIwMjItMDQtMjgKCkF1dGhvcjogTWljaGFlbCBKYWhuLCBQaEQKCkFmZmlsYXRpb25zOgoKICAtIFNjaWVuY2UgRm9yIExpZmUgTGFib3JhdG9yeSAoS1RIKSwgU3RvY2tob2xtLCBTd2VkZW4KICAtIE1heC1QbGFuY2stVW5pdCBmb3IgdGhlIFNjaWVuY2Ugb2YgUGF0aG9nZW5zLCBCZXJsaW4sIEdlcm1hbnkKCiMgU2Vzc2lvbiBJbmZvCgpgYGB7cn0Kc2Vzc2lvbkluZm8oKQpgYGAK